// router/routeFilter.js

/**
 * 检查用户是否有权限访问该路由
 * @param {Object} route 路由对象
 * @param {Array<String>} userPermissions 用户权限列表
 * @returns {Boolean}
 */
const hasPermission = (route, userPermissions) => {
    // 如果meta中没有permission字段,则认为不需要权限可访问
    if (!route.meta?.permission) {
        return true
    }

    // 检查用户是否拥有所需权限中的任意一个
    return route.meta.permission.some(permission => userPermissions.includes(permission))
}

/**
 * 过滤路由配置
 * @param {Array} routes 路由配置数组
 * @param {Array<String>} permissions 用户权限列表 
 * @returns {Array} 过滤后的路由配置
 */
export const filterRoutes = (routes, permissions) => {
    const res = []

    routes.forEach(route => {
        // 创建路由副本,避免修改原始配置
        const tmp = { ...route }

        // 检查当前路由的访问权限
        const hasRoutePermission = hasPermission(tmp, permissions)

        // 递归处理子路由
        if (tmp.children) {
            tmp.children = filterRoutes(tmp.children, permissions)

            // 处理重定向
            if (tmp.redirect && typeof tmp.redirect === 'object' && tmp.redirect.name) {
                // 检查重定向目标是否可访问
                const targetRoute = tmp.children.find(r => r.name === tmp.redirect.name)
                if (!targetRoute) {
                    // 如果重定向目标不可访问,重定向到第一个可访问的子路由
                    const firstAccessibleChild = tmp.children[0]
                    if (firstAccessibleChild) {
                        tmp.redirect = { name: firstAccessibleChild.name }
                    } else {
                        delete tmp.redirect
                    }
                }
            }

            //只检查当前路由的权限
            if (hasRoutePermission || (tmp.children && tmp.children.length)) {
                res.push(tmp)
            }
        }

        // 当前路由有权限 或 有可访问子路由时保留
        if (hasRoutePermission || (tmp.children && tmp.children.length)) {
            res.push(tmp)
        }
    })

    return res
}